package com.app.sgd.business.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.StringTokenizer;

import javax.sql.DataSource;

import oracle.jdbc.OracleTypes;

import org.apache.log4j.Logger;

import com.app.sgd.model.bean.ExpedienteBCA;
import com.app.sgd.plugin.JNDIConnector;
import com.app.sgd.util.Constants;
import com.app.sgd.view.vo.FiltroBusquedaVO;

public class OracleExpedienteDAO {
private static Logger logger = Logger.getLogger(OracleExpedienteDAO.class);
	
	DataSource ds = null;
	JNDIConnector cn = new JNDIConnector();
	
//	public ArrayList verificarExpedienteBCA(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
//		ArrayList lstExpedientes = new ArrayList();
//		Connection conn = null;
//		PreparedStatement pre = null;
//		CallableStatement call = null;
//		ResultSet rs = null;
//		try{
//			conn = cn.connect(0).getConnection();
//	    	
//			String sql1 = "";
//			
//			if(filtroBusquedaVO.getOpcion() == null || filtroBusquedaVO.getOpcion().equals(Constants.VALOR_DEFAULT_CERO))
//				sql1 = "	   AND UPPER(A.NUMEROEXPEDIENTEBCA) LIKE '%"+filtroBusquedaVO.getNumExpedienteBCA().trim()+"%'" ;
//			else
//	    		sql1 = "	   AND UPPER(A.NUMEROEXPEDIENTEBCA) LIKE '%"+ filtroBusquedaVO.getNumExpedienteBCA().trim() + "%'" +
//					"	   AND (A.CODIGOTIPOEXPEDIENTEBCA = '"+filtroBusquedaVO.getCodTipoProceso().trim()+"' OR '"+filtroBusquedaVO.getCodTipoProceso()+"' = '0')" +
//					"	   AND (A.CODIGOSTATUSBCA = '"+filtroBusquedaVO.getCodEstado().trim()+"' OR '"+filtroBusquedaVO.getCodEstado()+"' = '0')" +
//					"      AND (A.FECHAEXPEDIENTEBCA >= '"+filtroBusquedaVO.getFechaInicio().trim()+"' OR '"+filtroBusquedaVO.getFechaInicio().trim()+"' = '')" +
//					"      AND (A.FECHAEXPEDIENTEBCA <= '"+filtroBusquedaVO.getFechaFin().trim()+"' OR '"+filtroBusquedaVO.getFechaFin().trim()+"' = '')" ;
//	    	
//			String vSQL = "select A.CODIGOTIPOEXPEDIENTEBCA, " +
//						  "     TO_CHAR(A.FECHAEXPEDIENTEBCA,'DD/MM/YYYY') FECHAEXP, " + 
//						  "     A.NUMEROEXPEDIENTE,  " +
//						  "     A.CODIGOTIPOTEMATICO,  " +
//						  "     A.CODIGOSUBTIPOTEMATICO, " + 
//						  "     A.CODIGOTEMATICO,  " +
//						  "     B.NOMBRETEMATICO,  " +
//						  "     C.DESCRIPCIONTIPOEXPEDIENTEBCA, " + 
//						  "     A.NUMEROEXPEDIENTEBCA, " +
//						  "     D.DESCRPCIONSTATUSBCA , " +
//						  "     SAU_FN_PARTICIPANTES(A.CODIGOTIPOEXPEDIENTEBCA, A.NUMEROEXPEDIENTE, 1) as SOLICITANTES, " +
//						  "     SAU_FN_PARTICIPANTES(A.CODIGOTIPOEXPEDIENTEBCA, A.NUMEROEXPEDIENTE, 2) as INVITADOS , " +
//						  "     SAU_FN_MEDIADORES   (A.CODIGOTIPOEXPEDIENTEBCA, A.NUMEROEXPEDIENTE) as PROFESIONALES , " +
//						  "     nvl(EM3.DESCESTADOBCA,' ') AS ESTADOEXPEDIENTEBCA , " +
//						  "     nvl(AV0.DESCAVISO,' ') AS DESCAVISO  " +
//						  "from TEMATICO B, TIPOEXPEDIENTEBCA C, STATUSEXPEDIENTEBCA D, EXPEDIENTEBCA A  " +
//						  "LEFT JOIN (select EM2.CODIGOTIPOEXPEDIENTEBCA,EM2.NUMEROEXPEDIENTE,EM2.DESCESTADOBCA " + 
//						  "             FROM ESTADOSHISTORICOEXPEDIENTEBCA EM2 " +
//						  "            INNER JOIN (SELECT M.CODIGOTIPOEXPEDIENTEBCA, " +
//						  "                               M.NUMEROEXPEDIENTE, " +
//						  "                               MAX(M.NumeroEstadoBCA) " + 
//						  "                               NUMEROESTADOBCA " +
//						  "                          FROM ESTADOSHISTORICOEXPEDIENTEBCA M " +
//						  "                      GROUP BY M.CODIGOTIPOEXPEDIENTEBCA,  " +
//						  "                               M.NUMEROEXPEDIENTE) EM1 ON EM1.CODIGOTIPOEXPEDIENTEBCA = EM2.CODIGOTIPOEXPEDIENTEBCA " + 
//						  "                                                      AND EM1.NUMEROEXPEDIENTE = EM2.NUMEROEXPEDIENTE  " +
//						  "                                                      AND EM1.NumeroEstadoBCA = EM2.NumeroEstadoBCA) EM3 ON A.CODIGOTIPOEXPEDIENTEBCA = EM3.CODIGOTIPOEXPEDIENTEBCA " + 
//						  "                                                                                                        AND A.NUMEROEXPEDIENTE = EM3.NUMEROEXPEDIENTE " + 
//						  "		LEFT JOIN (select AV1.CODIGOTIPOEXPEDIENTEBCA, " + 
//						  "	                  AV1.NUMEROEXPEDIENTE, " +
//							"	                  AV1.DESCAVISO " +
//							"               FROM EXPEDIENTEAVISOS AV1 " + 
//							"	            INNER JOIN (SELECT X.CODIGOTIPOEXPEDIENTEBCA, " + 
//							"	                               X.NUMEROEXPEDIENTE,  " +
//							"	                               MAX(X.NumeroAvisoBCA) NUMEROAVISOBCA " + 
//							"	                          FROM EXPEDIENTEAVISOS X " +
//							"	                         WHERE X.ESTADOAVISO=0 " +
//							"	                         GROUP BY X.CODIGOTIPOEXPEDIENTEBCA, " +
//							"	                                  X.NUMEROEXPEDIENTE) AV2 ON AV2.CODIGOTIPOEXPEDIENTEBCA = AV1.CODIGOTIPOEXPEDIENTEBCA " + 
//							"	                                                         AND AV2.NUMEROEXPEDIENTE = AV1.NUMEROEXPEDIENTE  " +
//							"	                                                         AND AV2.NumeroAvisoBCA = AV1.NumeroAvisoBCA) AV0 ON A.CODIGOTIPOEXPEDIENTEBCA = AV0.CODIGOTIPOEXPEDIENTEBCA " + 
//							"	                                                                                                         AND A.NUMEROEXPEDIENTE = AV0.NUMEROEXPEDIENTE " + 
//							"	 where A.CODIGOTIPOTEMATICO = B.CODIGOTIPOTEMATICO  " +
//							"	   and A.CODIGOSUBTIPOTEMATICO = B.CODIGOSUBTIPOTEMATICO " + 
//							"	   and A.CODIGOTEMATICO = B.CODIGOTEMATICO  " +
//							"	   and A.CODIGOTIPOEXPEDIENTEBCA = C.CODIGOTIPOEXPEDIENTEBCA " + 
//							"	   AND A.CODIGOSTATUSBCA = D.CODIGOSTATUSBCA " +  
//							sql1 +
//							"	order by A.NUMEROEXPEDIENTE desc, " +
//							"	         A.FECHAEXPEDIENTEBCA desc, " + 
//							"	         A.CODIGOTIPOEXPEDIENTEBCA";
//			
//
//			pre = conn.prepareStatement(vSQL);
//			logger.info("ini: " + new Date());
//            rs = pre.executeQuery();
//            logger.info("fin: " + new Date());
//            int ind=0;
//            while(rs.next()){
//            	ExpedienteBCA expedienteBCA = new ExpedienteBCA();
//            	expedienteBCA.setIndice(String.valueOf(ind++));
//            	expedienteBCA.setCodigoTipoExpedienteBCA(rs.getString("CODIGOTIPOEXPEDIENTEBCA").trim());
//            	expedienteBCA.setNumeroExpediente(rs.getString("NUMEROEXPEDIENTE").trim());
//            	expedienteBCA.setCodigoTipoTematico(rs.getString("CODIGOTIPOTEMATICO").trim());
//            	expedienteBCA.setCodigoSubtipoTematico(rs.getString("CODIGOSUBTIPOTEMATICO").trim());
//            	expedienteBCA.setCodigoTematico(rs.getString("CODIGOTEMATICO").trim());
//            	expedienteBCA.setFechaExpediente(rs.getString("FECHAEXP").trim());
//            	expedienteBCA.setNombreTematico(rs.getString("NOMBRETEMATICO").trim());
//            	expedienteBCA.setDescripcionTipoExpedienteBCA(rs.getString("DESCRIPCIONTIPOEXPEDIENTEBCA").trim());
//            	expedienteBCA.setNumeroExpedienteBCA(rs.getString("NUMEROEXPEDIENTEBCA").trim());
//            	expedienteBCA.setDescEstadoBCA(rs.getString("DESCRPCIONSTATUSBCA").trim());
//
//            	lstExpedientes.add(expedienteBCA);
//            }
//		}catch(Exception e){
//			logger.error("[STD]: Error en verificarExpedienteBCA: " + e.getMessage());
//            e.printStackTrace();
//		}
//		finally{
//			cn.destroy(conn,null,rs,call,pre);
//		}
//		return lstExpedientes;
//	}
	
	public ArrayList listarExpedientesBCA(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstExpedientes = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect(0).getConnection();
	    	
			String vSQL = "call PKG_SAU_EXPEDIENTE_BCA.SAU_SP_LST_EXP_BCA (?,?,?,?,?,?)";
	    	
			call = conn.prepareCall(vSQL);
			call.setString(1,filtroBusquedaVO.getCodTipoProceso());
			call.setString(2, filtroBusquedaVO.getNumExpedienteBCA());
			call.setString(3, filtroBusquedaVO.getFechaInicio());
			call.setString(4, filtroBusquedaVO.getFechaFin());
			call.setString(5, filtroBusquedaVO.getCodEstado());
			call.registerOutParameter(6, OracleTypes.CURSOR);
			logger.info("ini: " + new Date());
			call.execute();
            logger.info("fin: " + new Date());
            rs = (ResultSet) call.getObject(6);
            
            int ind=0;
            while(rs.next()){
            	ExpedienteBCA expedienteBCA = new ExpedienteBCA();
            	expedienteBCA.setIndice(String.valueOf(ind++));
            	expedienteBCA.setCodigoTipoExpedienteBCA(rs.getString("CODIGOTIPOEXPEDIENTEBCA").trim());
            	expedienteBCA.setNumeroExpediente(rs.getString("NUMEROEXPEDIENTE").trim());
            	expedienteBCA.setCodigoTipoTematico(rs.getString("CODIGOTIPOTEMATICO").trim());
            	expedienteBCA.setCodigoSubtipoTematico(rs.getString("CODIGOSUBTIPOTEMATICO").trim());
            	expedienteBCA.setCodigoTematico(rs.getString("CODIGOTEMATICO").trim());
            	expedienteBCA.setFechaExpediente(rs.getString("FECHAEXP").trim());
            	expedienteBCA.setNombreTematico(rs.getString("NOMBRETEMATICO").trim());
            	expedienteBCA.setDescripcionTipoExpedienteBCA(rs.getString("DESCRIPCIONTIPOEXPEDIENTEBCA").trim());
            	expedienteBCA.setNumeroExpedienteBCA(rs.getString("NUMEROEXPEDIENTEBCA").trim());
            	expedienteBCA.setDescEstadoBCA(rs.getString("DESCRPCIONSTATUSBCA").trim());
            	expedienteBCA.setSolicitantes(rs.getString("SOLICITANTES")==null ? Constants.VALOR_DEFAULT_VACIO : rs.getString("SOLICITANTES").trim());
            	expedienteBCA.setDemandado(rs.getString("INVITADOS")==null ? Constants.VALOR_DEFAULT_VACIO : rs.getString("INVITADOS").trim());
            	expedienteBCA.setProfesionales(rs.getString("PROFESIONALES")==null ? Constants.VALOR_DEFAULT_VACIO : rs.getString("PROFESIONALES").trim());

            	String profesionales = expedienteBCA.getProfesionales();
                if (profesionales.length()>0){
                    StringTokenizer strPro = new StringTokenizer(profesionales,"|");
                    int ipro=0;
                    while(strPro.hasMoreTokens()){
                    	String nombre = "";
                        if(ipro==0){
                        	nombre = strPro.nextToken().toUpperCase();
                        	profesionales="-" + nombre + ".";
                        }
                        else{
                        	nombre = strPro.nextToken().toUpperCase();
                        	profesionales+= "<br>" + "-" + nombre + ".";
                        }
                        ipro++;
                    }
                    strPro=null;
                }
                expedienteBCA.setProfesionales(profesionales);
                
                String demandados = expedienteBCA.getDemandado();
                if (demandados.length()>0){
                    StringTokenizer strInv =new StringTokenizer(demandados,"|");
                    StringTokenizer strt1;
                    String CodiInv;
                    int iinv=0;
                    while(strInv.hasMoreTokens()){
                    	String nombre = "";
                        strt1 =  new StringTokenizer(strInv.nextToken(),"~");
                        if(strt1.hasMoreTokens()){CodiInv=strt1.nextToken();}
                        if(strt1.hasMoreTokens()){
                            if(iinv==0){
                            	nombre = strt1.nextToken().toUpperCase();
                            	demandados="-" + nombre + ".";
                            }
                            else{
                            	nombre = strt1.nextToken().toUpperCase();
                            	demandados+= "<br>" + "-" + nombre + ".";
                            }
                        }
                        iinv++;
                    }
                    strInv=null;
                }
                expedienteBCA.setDemandado(demandados);
                
                String solicitantes = expedienteBCA.getSolicitantes();
                if (demandados.length()>0){
                    StringTokenizer strSol =new StringTokenizer(solicitantes,"|");
                    StringTokenizer strt1;
                    String CodiSol;
                    int isol=0;
                    while(strSol.hasMoreTokens()){
                    	String nombre = "";
                        strt1 =  new StringTokenizer(strSol.nextToken(),"~");
                        if(strt1.hasMoreTokens()){CodiSol=strt1.nextToken();}
                        if(strt1.hasMoreTokens()){
                            if(isol==0){
                            	nombre = strt1.nextToken().toUpperCase();
                            	solicitantes= "-" + nombre + ".";
                            }
                            else{
                            	nombre = strt1.nextToken().toUpperCase();
                            	solicitantes+="<br>" + "-" + nombre + ".";
                            }
                        }
                        isol++;
                    }
                    strSol=null;
                }
                expedienteBCA.setSolicitantes(solicitantes);
                
            	lstExpedientes.add(expedienteBCA);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarExpedientesBCA: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstExpedientes;
	}
	
	public int insertarEstadoExpedienteBCA(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		int res = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect(0).getConnection();

	    	String vSQL = "call PKG_SAU_EXPEDIENTE_BCA.SAU_SP_INS_HIST_EXP_BCA (?,?,?,?,?,?,?)";
	    	pre = conn.prepareStatement(vSQL);
	    	pre.setString(1,filtroBusquedaVO.getExpedienteBCA().getCodigoTipoExpedienteBCA());
	    	pre.setInt(2,Integer.parseInt(filtroBusquedaVO.getExpedienteBCA().getNumeroExpediente()));
	    	pre.setString(3,filtroBusquedaVO.getAsunto());
	    	pre.setString(4,filtroBusquedaVO.getUsuario().getLogin());
	    	pre.setString(5,filtroBusquedaVO.getUsuario().getDireccionIP());
	    	pre.setString(6,filtroBusquedaVO.getFechaEmision());
	    	pre.setString(7,filtroBusquedaVO.getNumProveido());
//	    	logger.info("inicio:" + new Date());
	    	res = pre.executeUpdate();
//	    	logger.info("fin: " + new Date());	    	
		}catch(Exception e){
			logger.error("[STD]: Error en insertarEstadoExpedienteBCA: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}
	
	public int insertarCargoEstadoExpedienteBCA(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		int res = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect(0).getConnection();

	    	String vSQL = "call PKG_SAU_EXPEDIENTE_BCA.SAU_SP_INS_CARGO_EXP_BCA (?,?,?,?,?,?,?,?)";
	    	pre = conn.prepareStatement(vSQL);
	    	pre.setString(1,filtroBusquedaVO.getExpedienteBCA().getCodigoTipoExpedienteBCA());
	    	pre.setInt(2,Integer.parseInt(filtroBusquedaVO.getExpedienteBCA().getNumeroExpediente()));
	    	pre.setString(3,filtroBusquedaVO.getAsunto());
	    	pre.setString(4,filtroBusquedaVO.getNumDocumento());
	    	pre.setString(5,filtroBusquedaVO.getNumProveido());
	    	pre.setString(6,filtroBusquedaVO.getUsuario().getLogin());
	    	pre.setString(7,filtroBusquedaVO.getUsuario().getDireccionIP());
	    	pre.setString(8,filtroBusquedaVO.getFechaRecepcion());
//	    	logger.info("inicio:" + new Date());
	    	res = pre.executeUpdate();
//	    	logger.info("fin: " + new Date());	    	
		}catch(Exception e){
			logger.error("[STD]: Error en insertarCargoEstadoExpedienteBCA: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}
	
	public ArrayList obtenerExpedientesBCA(int numExpediente) throws Exception {
		ArrayList lstExpedientes = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect(0).getConnection();
	    	
			String vSQL = "call PKG_SAU_EXPEDIENTE_BCA.SAU_SP_GET_EXP_BCA (?,?)";
	    	
			call = conn.prepareCall(vSQL);
			call.setInt(1,numExpediente);
			call.registerOutParameter(2, OracleTypes.CURSOR);
			logger.info("ini: " + new Date());
			call.execute();
            logger.info("fin: " + new Date());
            rs = (ResultSet) call.getObject(2);
            
            int ind=0;
            while(rs.next()){
            	ExpedienteBCA expedienteBCA = new ExpedienteBCA();
            	expedienteBCA.setIndice(String.valueOf(ind++));
            	expedienteBCA.setCodigoTipoExpedienteBCA(rs.getString("CODIGOTIPOEXPEDIENTEBCA").trim());
            	expedienteBCA.setNumeroExpediente(rs.getString("NUMEROEXPEDIENTE").trim());
            	expedienteBCA.setCodigoTipoTematico(rs.getString("CODIGOTIPOTEMATICO").trim());
            	expedienteBCA.setCodigoSubtipoTematico(rs.getString("CODIGOSUBTIPOTEMATICO").trim());
            	expedienteBCA.setCodigoTematico(rs.getString("CODIGOTEMATICO").trim());
            	expedienteBCA.setFechaExpediente(rs.getString("FECHAEXP").trim());
            	expedienteBCA.setNombreTematico(rs.getString("NOMBRETEMATICO").trim());
            	expedienteBCA.setDescripcionTipoExpedienteBCA(rs.getString("DESCRIPCIONTIPOEXPEDIENTEBCA").trim());
            	expedienteBCA.setNumeroExpedienteBCA(rs.getString("NUMEROEXPEDIENTEBCA").trim());
            	expedienteBCA.setDescEstadoBCA(rs.getString("DESCRPCIONSTATUSBCA").trim());
            	expedienteBCA.setSolicitantes(rs.getString("SOLICITANTES").trim());
            	expedienteBCA.setDemandado(rs.getString("INVITADOS").trim());
            	expedienteBCA.setProfesionales(rs.getString("PROFESIONALES").trim()); 

                String profesionales = expedienteBCA.getProfesionales();
                if (profesionales.length()>0){
                    StringTokenizer strPro = new StringTokenizer(profesionales,"|");
                    int ipro=0;
                    while(strPro.hasMoreTokens()){
                    	String nombre = "";
                        if(ipro==0){
                        	nombre = strPro.nextToken().toUpperCase();
                        	profesionales="-" + nombre + ".";
                        }
                        else{
                        	nombre = strPro.nextToken().toUpperCase();
                        	profesionales+= " " + "-" + nombre + ".";
                        }
                        ipro++;
                    }
                    strPro=null;
                }
                expedienteBCA.setProfesionales(profesionales);
                
                String demandados = expedienteBCA.getDemandado();
                if (demandados.length()>0){
                    StringTokenizer strInv =new StringTokenizer(demandados,"|");
                    StringTokenizer strt1;
                    String CodiInv;
                    int iinv=0;
                    while(strInv.hasMoreTokens()){
                    	String nombre = "";
                        strt1 =  new StringTokenizer(strInv.nextToken(),"~");
                        if(strt1.hasMoreTokens()){CodiInv=strt1.nextToken();}
                        if(strt1.hasMoreTokens()){
                            if(iinv==0){
                            	nombre = strt1.nextToken().toUpperCase();
                            	demandados="-" + nombre + ".";
                            }
                            else{
                            	nombre = strt1.nextToken().toUpperCase();
                            	demandados+= " " + "-" + nombre + ".";
                            }
                        }
                        iinv++;
                    }
                    strInv=null;
                }
                expedienteBCA.setDemandado(demandados);
                
                String solicitantes = expedienteBCA.getSolicitantes();
                if (demandados.length()>0){
                    StringTokenizer strSol =new StringTokenizer(solicitantes,"|");
                    StringTokenizer strt1;
                    String CodiSol;
                    int isol=0;
                    while(strSol.hasMoreTokens()){
                    	String nombre = "";
                        strt1 =  new StringTokenizer(strSol.nextToken(),"~");
                        if(strt1.hasMoreTokens()){CodiSol=strt1.nextToken();}
                        if(strt1.hasMoreTokens()){
                            if(isol==0){
                            	nombre = strt1.nextToken().toUpperCase();
                            	solicitantes= "-" + nombre + ".";
                            }
                            else{
                            	nombre = strt1.nextToken().toUpperCase();
                            	solicitantes+=" " + "-" + nombre + ".";
                            }
                        }
                        isol++;
                    }
                    strSol=null;
                }
                expedienteBCA.setSolicitantes(solicitantes);
                
            	lstExpedientes.add(expedienteBCA);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en obtenerExpedientesBCA: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstExpedientes;
	}
}
